package com.yesido.spring.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * @author yesido
 * @description
 * @date 2023-06-24 22:17
 * @Version 8.3
 */
@Aspect
@Component
public class IdempotentAspect {
    // 模拟幂等性的缓存，用于存储已处理过的幂等键
    private Map<String, Object> idempotentCache = new HashMap<>();

    @Around("@annotation(idempotent)")
    public Object checkIdempotent(ProceedingJoinPoint joinPoint, Idempotent idempotent) throws Throwable {
        String key = idempotent.value();
        // 检查幂等键是否存在于缓存中
        if (idempotentCache.containsKey(key)) {
            // 幂等键已存在，直接返回缓存的结果
            return idempotentCache.get(key) +"===aspect";
        } else {
            // 幂等键不存在，执行方法并将结果存入缓存
            Object result = joinPoint.proceed();
            idempotentCache.put(key, result);
            return result;
        }
    }
}
